1 module hip.hipaudio.backend.opensles.source;
2 version(Android):
3 import hip.error.handler;
4 import hip.hipaudio.audioclip;
5 import hip.hipaudio.backend.sles;
6 import hip.util.time;
7 import hip.hipaudio.audiosource;
8 
9 version(Android):
10 
11 class HipOpenSLESAudioSource : HipAudioSource
12 {
13     SLIAudioPlayer* audioPlayer;
14     bool isStreamed;
15     this(SLIAudioPlayer* player, bool isStreamed)
16     {
17         audioPlayer = player;
18         this.isStreamed = isStreamed;
19     }
20 
21     alias clip = HipAudioSource.clip;
22     override IHipAudioClip clip(IHipAudioClip clip)
23     {
24         super.clip(clip);
25         return clip;
26     }
27 
28     override bool play()
29     {
30         SLIBuffer* buf = getBufferFromAPI(clip).sles;
31         SLIAudioPlayer.Enqueue(*audioPlayer, buf.data.ptr, buf.size);
32         buf.isLocked = true;
33         buf.hasBeenProcessed = false;
34 
35         import hip.console.log;
36 
37         logln("SampleRate: ", clip.getSampleRate);
38         logln("Output: ", clip.getHint().outputSamplerate);
39         float rate = cast(float)clip.getSampleRate() / cast(float)clip.getHint().outputSamplerate;
40         
41         SLIAudioPlayer.setRate(*audioPlayer, rate);
42 
43         SLIAudioPlayer.play(*audioPlayer);
44         return true;
45     }
46 
47     alias loop = HipAudioSource.loop;
48     override bool loop(bool shouldLoop)
49     {
50         super.loop(shouldLoop);
51         SLIAudioPlayer.setLoop(*audioPlayer, shouldLoop);
52         return shouldLoop;
53     }
54 
55     override bool stop()
56     {
57         SLIAudioPlayer.stop(*audioPlayer);
58         return false;
59     }
60 
61     override bool pause()
62     {
63         SLIAudioPlayer.pause(*audioPlayer);
64         return false;
65     }
66     bool resume()
67     {
68         SLIAudioPlayer.resume(*audioPlayer);
69         return false;   
70     }
71 
72 
73     override void pullStreamData()
74     {
75         import hip.util.memory;
76 
77         ErrorHandler.assertExit(clip !is null, "Can't pull stream data without any buffer attached");
78         ErrorHandler.assertExit(audioPlayer.playerObj != null, "Can't pull stream data without null audioplayer");
79         uint decoded = clip.updateStream();
80         import hip.console.log;
81         HipAudioBufferWrapper* freeBuf = getFreeBuffer();
82         
83         if(freeBuf != null)
84         {
85             audioPlayer.removeFreeBuffer(freeBuf.buffer.sles);
86             sendAvailableBuffer(freeBuf.buffer);
87         }
88         HipAudioClip c = cast(HipAudioClip)clip;
89         SLIBuffer* buf = c.getBuffer(c.getClipData(), c.chunkSize).sles;
90         audioPlayer.pushBuffer(buf);
91 
92     }
93 
94     override HipAudioBufferWrapper* getFreeBuffer()
95     {
96         SLIBuffer* b = audioPlayer.getProcessedBuffer();
97         if(b == null)
98             return null;
99         HipAudioBuffer buffer;
100         buffer.sles = b;
101         return (cast(HipAudioClip)clip).findBuffer(buffer);
102     }
103     
104 }